package cn.iocoder.yudao.module.reading.service.book;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.reading.controller.admin.book.vo.PictureBookCreateReqVO;
import cn.iocoder.yudao.module.reading.controller.admin.book.vo.PictureBookPageReqVO;
import cn.iocoder.yudao.module.reading.controller.admin.book.vo.PictureBookUpdateReqVO;
import cn.iocoder.yudao.module.reading.dal.dataobject.book.PictureBookDO;

import java.util.List;

/**
 * 管理员绘本 Service 接口
 *
 * @author 芋道源码
 */
public interface AdminPictureBookService {

    /**
     * 创建绘本
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createPictureBook(PictureBookCreateReqVO createReqVO);

    /**
     * 更新绘本
     *
     * @param updateReqVO 更新信息
     */
    void updatePictureBook(PictureBookUpdateReqVO updateReqVO);

    /**
     * 删除绘本
     *
     * @param id 编号
     */
    void deletePictureBook(Long id);

    /**
     * 获得绘本
     *
     * @param id 编号
     * @return 绘本
     */
    PictureBookDO getPictureBook(Long id);

    /**
     * 获得绘本分页
     *
     * @param pageReqVO 分页查询
     * @return 绘本分页
     */
    PageResult<PictureBookDO> getPictureBookPage(PictureBookPageReqVO pageReqVO);

    /**
     * 根据绘本集ID获取绘本列表
     *
     * @param bookSetId 绘本集ID
     * @return 绘本列表
     */
    List<PictureBookDO> getPictureBooksByBookSetId(Long bookSetId);

    /**
     * 批量创建绘本
     *
     * @param createReqVOs 创建信息列表
     * @return 编号列表
     */
    List<Long> batchCreatePictureBooks(List<PictureBookCreateReqVO> createReqVOs);

    /**
     * 获取下一个绘本ID
     * 用于在创建绘本之前获得真实ID，避免文件上传时的临时ID问题
     *
     * @return 下一个将要分配的绘本ID
     */
    Long getNextPictureBookId();

    /**
     * 批量获取下一批绘本ID
     * 用于在批量创建绘本之前获得真实ID列表，确保并发安全
     *
     * @param count 需要获取的ID数量
     * @return 连续的绘本ID列表
     */
    List<Long> getBatchNextPictureBookIds(int count);

    /**
     * 更新绘本的页面数量
     * 根据绘本ID统计实际页面数量并更新到绘本记录中
     *
     * @param bookId 绘本ID
     */
    void updateBookPageCount(Long bookId);

    /**
     * 批量更新绘本的页面数量
     * 根据绘本ID列表统计实际页面数量并更新到绘本记录中
     *
     * @param bookIds 绘本ID列表
     */
    void batchUpdateBookPageCount(List<Long> bookIds);

    /**
     * 获得绘本列表
     *
     * @param bookSetId 绘本集ID
     * @param title     标题
     * @return 绘本列表
     */
    List<PictureBookDO> getPictureBookList(Long bookSetId, String title);

}
